Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

C++ Funkcje do ładowania item_proto/mob_proto z SQL


Rekomendowane odpowiedzi

Opublikowano

Tak jak w tytule. Kto ogarniety to sie połapie 

 

 

bool CClientManager::InitializeMobTableMySQL()
{
	char query[2048];
	fprintf(stderr,"Loading mob_proto from MySQL ");
	snprintf(query, sizeof(query),
			"SELECT vnum,name,%s,rank,type,battle_type,level,size,ai_flag,mount_capacity,setRaceFlag,setImmuneFlag,"
"empire,folder,on_click,st,dx,ht,iq,damage_min,damage_max,max_hp,regen_cycle,regen_percent,gold_min,"
"gold_max,exp,def,attack_speed,move_speed,aggressive_hp_pct,aggressive_sight,attack_range,drop_item,"
"resurrection_vnum,enchant_curse,enchant_slow,enchant_poison,enchant_stun,enchant_critical,enchant_penetrate,"
"resist_sword,resist_twohand,resist_dagger,resist_bell,resist_fan,resist_bow,resist_fire,resist_elect,"
"resist_magic,resist_wind,resist_poison,dam_multiply,summon,drain_sp,mob_color,polymorph_item,skill_level0,"
"skill_vnum0,skill_level1,skill_vnum1,sp_berserk,sp_stoneskin,sp_godspeed,sp_deathblow,sp_revive,skill_level2,"
"skill_vnum2,skill_level3,skill_vnum3,skill_level4,skill_vnum4 FROM mob_proto%s"
,g_stLocaleNameColumn.c_str(),
			GetTablePostfix());
	CDBManager::instance().DirectQuery("set names utf8");
	std::unique_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
	SQLResult * pRes = pkMsg->Get();

	if (!pRes->uiNumRows)
		return false;

	if (!m_vec_mobTable.empty())
	{
		sys_log(0, "RELOAD: mob_proto");
		m_vec_mobTable.clear();
	}
	int size = pRes->uiNumRows+1;
	m_vec_mobTable.resize(size);
	memset(&m_vec_mobTable[0], 0, sizeof(TMobTable) * m_vec_mobTable.size());
	TMobTable * mob_table = &m_vec_mobTable[0];
	
	MYSQL_ROW data;
	//return true;
	set<int> vnumSet;
	while ((data = mysql_fetch_row(pRes->pSQLResult)))
	{
		
		/*
		"SELECT vnum,name,locale_name,rank,type,battle_type,level,size,ai_flag,mount_capacity,setRaceFlag,setImmuneFlag,"
"empire,folder,on_click,st,dx,ht,iq,damage_min,damage_max,max_hp,regen_cycle,regen_percent,gold_min,"
"gold_max,exp,def,attack_speed,move_speed,aggressive_hp_pct,aggressive_sight,attack_range,drop_item,"
"resurrection_vnum,enchant_curse,enchant_slow,enchant_poison,enchant_stun,enchant_critical,enchant_penetrate,"
"resist_sword,resist_twohand,resist_dagger,resist_bell,resist_fan,resist_bow,resist_fire,resist_elect,"
"resist_magic,resist_wind,resist_poison,dam_multiply,summon,drain_sp,mob_color,polymorph_item,skill_level0,"
"skill_vnum0,skill_level1,skill_vnum1,sp_berserk,sp_stoneskin,sp_godspeed,sp_deathblow,sp_revive,skill_level2,"
"skill_vnum2,skill_level3,skill_vnum3,skill_level4,skill_vnum4 FROM mob_proto%s */
		int col = 0;
		str_to_number(mob_table->dwVnum, data[col++]);
		if(mob_table->dwVnum ==0) continue;
		strlcpy(mob_table->szName,data[col++] , sizeof(mob_table->szName));
		strlcpy(mob_table->szLocaleName, Depol(data[col++]).c_str(), sizeof(mob_table->szLocaleName));
		str_to_number(mob_table->bRank,data[col++]);
		str_to_number(mob_table->bType,data[col++]);
		str_to_number(mob_table->bBattleType,data[col++]);
		str_to_number(mob_table->bLevel,data[col++]);
		str_to_number(mob_table->bSize,data[col++]);
		//AI_FLAG
		mob_table->dwAIFlag = get_Mob_AIFlag_Value(data[col++]);
		//mount_capacity;
		col++;
		//RACE_FLAG
		mob_table->dwRaceFlag = get_Mob_RaceFlag_Value(data[col++]);
		//IMMUNE_FLAG
		mob_table->dwImmuneFlag = get_Mob_ImmuneFlag_Value(data[col++]);
		mob_table->bEmpire = atoi(data[col++]);
		strlcpy(mob_table->szFolder, data[col++], sizeof(mob_table->szFolder));
		mob_table->bOnClickType = atoi(data[col++]);
		mob_table->bStr = atoi(data[col++]);
		mob_table->bDex = atoi(data[col++]);
		mob_table->bCon = atoi(data[col++]);
		mob_table->bInt = atoi(data[col++]);
		mob_table->dwDamageRange[0] = atoi(data[col++]);
		mob_table->dwDamageRange[1] = atoi(data[col++]);
		mob_table->dwMaxHP = atoi(data[col++]);
		mob_table->bRegenCycle = atoi(data[col++]);
		mob_table->bRegenPercent = atoi(data[col++]);
		mob_table->dwGoldMin = atoi(data[col++]);
		mob_table->dwGoldMax = atoi(data[col++]);
		mob_table->dwExp = atoi(data[col++]);
		mob_table->wDef = atoi(data[col++]);
		mob_table->sAttackSpeed = atoi(data[col++]);
		mob_table->sMovingSpeed = atoi(data[col++]);
		mob_table->bAggresiveHPPct = atoi(data[col++]);
		mob_table->wAggressiveSight = atoi(data[col++]);
		mob_table->wAttackRange = atoi(data[col++]);	
		str_to_number(mob_table->dwDropItemVnum, data[col++]);	//32
		str_to_number(mob_table->dwResurrectionVnum, data[col++]);
		for (int i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i)
			str_to_number(mob_table->cEnchants[i], data[col++]);

		for (int i = 0; i < MOB_RESISTS_MAX_NUM; ++i)
			str_to_number(mob_table->cResists[i], data[col++]);

		str_to_number(mob_table->fDamMultiply, data[col++]);
		str_to_number(mob_table->dwSummonVnum, data[col++]);
		str_to_number(mob_table->dwDrainSP, data[col++]);

		//Mob_Color
		++col;

		str_to_number(mob_table->dwPolymorphItemVnum, data[col++]);

		str_to_number(mob_table->Skills[0].bLevel, data[col++]);
		str_to_number(mob_table->Skills[0].dwVnum, data[col++]);
		str_to_number(mob_table->Skills[1].bLevel, data[col++]);
		str_to_number(mob_table->Skills[1].dwVnum, data[col++]);
		str_to_number(mob_table->Skills[2].bLevel, data[col++]);
		str_to_number(mob_table->Skills[2].dwVnum, data[col++]);
		str_to_number(mob_table->Skills[3].bLevel, data[col++]);
		str_to_number(mob_table->Skills[3].dwVnum, data[col++]);
		str_to_number(mob_table->Skills[4].bLevel, data[col++]);
		str_to_number(mob_table->Skills[4].dwVnum, data[col++]);

		str_to_number(mob_table->bBerserkPoint, data[col++]);
		str_to_number(mob_table->bStoneSkinPoint, data[col++]);
		str_to_number(mob_table->bGodSpeedPoint, data[col++]);
		str_to_number(mob_table->bDeathBlowPoint, data[col++]);
		str_to_number(mob_table->bRevivePoint, data[col++]);

		//ĽÂżˇ vnum Ăß°ˇ
		vnumSet.insert(mob_table->dwVnum);
		
		
		//fprintf(stderr, "MOB #%d %s %s level: %u rank: %u empire: %d\n", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->bLevel, mob_table->bRank, mob_table->bEmpire);
		sys_log(0, "MOB #%-5d %-24s %-24s level: %-3u rank: %u empire: %d", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->bLevel, mob_table->bRank, mob_table->bEmpire);
		++mob_table;
	}
	fprintf(stderr," Complete! %d/%d Mobs loaded.\r\n",size,vnumSet.size());
	sort(m_vec_mobTable.begin(), m_vec_mobTable.end(), FCompareVnum());
	return true;
}

bool CClientManager::InitializeItemTableMySQL()
{
            char query[2048];
            fprintf(stderr,"Loading item_proto from MySQL");
            snprintf(query, sizeof(query),
            "SELECT vnum,vnum_range,name,locale_name,type,subtype,weight,size,antiflag,flag,wearflag,immuneflag+0,gold,shop_buy_price,refined_vnum,"
            "refine_set,magic_pct,limittype0,limitvalue0,limittype1,limitvalue1,applytype0,applyvalue0,"
            "applytype1,applyvalue1,applytype2,applyvalue2,value0,value1,value2,value3,value4,value5,socket_pct,addon_type FROM player.item_proto where not isnull(locale_name) ORDER BY vnum");
			
	
            std::unique_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
            SQLResult * pRes = pkMsg->Get();
     
            if (!pRes->uiNumRows)
                    return false;
            int addNumber = pRes->uiNumRows+1;
            if (!m_vec_itemTable.empty())
            {
                    sys_log(0, "RELOAD: item_proto");
                    m_vec_itemTable.clear();
                    m_map_itemTableByVnum.clear();
            }
     
            m_vec_itemTable.resize(addNumber-1);
            memset(&m_vec_itemTable[0], 0, sizeof(TItemTable) * m_vec_itemTable.size());
            TItemTable * item_table = &m_vec_itemTable[0];
     
            MYSQL_ROW data;
            //return true;
            set<int> vnumSet;
            while ((data = mysql_fetch_row(pRes->pSQLResult)))
            {
                    str_to_number(item_table->dwVnum, data[0]);
                    str_to_number(item_table->dwVnumRange, data[1]);
                    strlcpy(item_table->szName,data[2] , sizeof(item_table->szName));
                    strlcpy(item_table->szLocaleName, Depol(data[3]).c_str(), sizeof(item_table->szLocaleName));
                    str_to_number(item_table->bType, data[4]);
                    str_to_number(item_table->bSubType, data[5]);
                    str_to_number(item_table->bWeight, data[6]);
                    str_to_number(item_table->bSize, data[7]);
                    str_to_number(item_table->dwAntiFlags, data[8]);
                    str_to_number(item_table->dwFlags, data[9]);
                    str_to_number(item_table->dwWearFlags, data[10]);
                    str_to_number(item_table->dwImmuneFlag, data[11]);
                    str_to_number(item_table->dwGold, data[12]);
                    str_to_number(item_table->dwShopBuyPrice, data[13]);
                    str_to_number(item_table->dwRefinedVnum, data[14]);
                    str_to_number(item_table->wRefineSet, data[15]);
                    str_to_number(item_table->bAlterToMagicItemPct, data[16]);
                    item_table->cLimitRealTimeFirstUseIndex = -1;
                    item_table->cLimitTimerBasedOnWearIndex = -1;
                   
                    str_to_number(item_table->aLimits[0].bType, data[17]);
                    str_to_number(item_table->aLimits[0].lValue, data[18]);
                    if (LIMIT_REAL_TIME_START_FIRST_USE == item_table->aLimits[0].bType)
                            item_table->cLimitRealTimeFirstUseIndex = (char)0;
                    if (LIMIT_TIMER_BASED_ON_WEAR == item_table->aLimits[0].bType)
                            item_table->cLimitTimerBasedOnWearIndex = (char)0;
                           
                    str_to_number(item_table->aLimits[1].bType, data[19]);
                    str_to_number(item_table->aLimits[1].lValue, data[20]);
                    if (LIMIT_REAL_TIME_START_FIRST_USE == item_table->aLimits[1].bType)
                            item_table->cLimitRealTimeFirstUseIndex = (char)1;
                    if (LIMIT_TIMER_BASED_ON_WEAR == item_table->aLimits[1].bType)
                            item_table->cLimitTimerBasedOnWearIndex = (char)1;
                   
     
                    str_to_number(item_table->aApplies[0].bType, data[21]);
                    str_to_number(item_table->aApplies[0].lValue, data[22]);
                   
                    str_to_number(item_table->aApplies[1].bType, data[23]);
                    str_to_number(item_table->aApplies[1].lValue, data[24]);
                   
                    str_to_number(item_table->aApplies[2].bType, data[25]);
                    str_to_number(item_table->aApplies[2].lValue, data[26]);
                   
     
                    str_to_number(item_table->alValues[0], data[27]);
                    str_to_number(item_table->alValues[1], data[28]);
                    str_to_number(item_table->alValues[2], data[29]);
                    str_to_number(item_table->alValues[3], data[30]);
                    str_to_number(item_table->alValues[4], data[31]);
					str_to_number(item_table->alValues[5], data[32]);
                           
                    str_to_number(item_table->bGainSocketPct, data[33]);
                    str_to_number(item_table->sAddonType, data[34]);
			
     
                    vnumSet.insert(item_table->dwVnum);
                    m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table));
                    sys_log(0, "ITEM: #%-5lu %-24s %-24s ADDON: %d VAL: %d %ld %d %d %d %d WEAR %d ANTI %d IMMUNE %d REFINE %lu REFINE_SET %u MAGIC_PCT %u",
                                    item_table->dwVnum,
                                    item_table->szName,
                                    item_table->szLocaleName,
                                    item_table->sAddonType,
                                    item_table->alValues[0],
                                    item_table->alValues[1],
                                    item_table->alValues[2],
                                    item_table->alValues[3],
                                    item_table->alValues[4],
                                    item_table->alValues[5],
                                    item_table->dwWearFlags,
                                    item_table->dwAntiFlags,
                                    item_table->dwImmuneFlag,
                                    item_table->dwRefinedVnum,
                                    item_table->wRefineSet,
                                    item_table->bAlterToMagicItemPct);
     
                    item_table++;
            }
            fprintf(stderr," Complete! %d Items loaded.\r\n",addNumber);
            return true;
}

 

 

Czekam na niedojebow pod moim postem, pierwszy doswiadczy buta na mordzie  :yay:

ban.gif

 

Opublikowano

Tym ze najwyrazniej nie umiesz C++ i sobie porownac:)

Ale to chyba każdy potrafi sobie edytować, bo jeśli dobrze pamiętam, to kilka błędów było na tym co jest na mpc.

Co nie zmienia faktu, że nie Ciebie pytałem.  B)

Opublikowano

@alchemik1

A czym się to różni od tego, które jest nawet na tym forum udostępnione?

A no tym ze na tych funkcjach DB wlacza sie caly czas, a nie jak mu sie podoba

 

Do czego służy vnum_range? Co w tej kolumnie jest przechowywane? 

To jest do alchemi

 

Mam rozumieć, że dzięki temu moge zmieniać, usuwać, edytować, dodawać tabelki ?

Dzieki temu DB wlacza sie zawsze 

ban.gif

 

  • 11 miesięcy temu...
Opublikowano

a gdzie to się podmienia ? Bo u mnie jest problem że nie włącza się wg DB

[25] [50] [75] [100] [125] [150] [175] [200] [225] [250] [275] [300] [325] [350] [375] [400] [425] [450] [475] [500]


 


Ranga: Debiutant

Opublikowano

Przeniosłeś się na wyższe gcc, że używasz unique_ptr zamiast auto_ptr ?

 

A tak poważnie to zmiany są minimalne, a przeciętny programista mpcforum po ctrl+c ctrl+v nie będzie wiedział dlaczego mu się db nie kompiluje. 

 

I jeszcze jedna rzecz. Jeżeli w plikach jest przewidziane aby w conf.txt czy tam jedną linijką w kodzie można zmieniać LocaleNameColumn czy TablePostfix to trzymajmy się założeń kodu ułatwi to życie. 

 

Tak samo 

 

16     CDBManager::instance().DirectQuery("set names utf8");

nie jest odpowiednim miejscem na takie zabiegi. 

 

Jak dla mnie jedyną ciekawostką jest where not isnull(locale_name). Twój kod jest zapewne wyciągnięty z Twojego source przez co same te dwie funkcje sprawdzą się dobrze w Twoim kodzie. A w czystym source będą nie uniwersalne. 

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...